package com.yuandian.utils.poi;

import com.alibaba.excel.context.AnalysisContext;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 默认的Excel读取解析监听器，如有定制化的校验规则，请自定义监听器继承AbstractExcelEventListener
 * </p>
 *
 * @author: tangqingchun
 * @date: 2020-09-03
 */
@Slf4j
public class ExcelDefaultReadListener<T> extends AbstractExcelEventListener<T> {

    /**
     * Excel解析操作service，提供校验与保存接口
     */
    private ExcelService<T> excelService;

    /**
     * 批量保存数量
     */
    private static final int BATCH_COUNT = 1000;

    /**
     * 校验成功结果集
     */
    private final List<T> resultList = new ArrayList<>();

    /**
     * 校验失败结果集
     */
    private final List<T> failList = new ArrayList<>();

    public ExcelDefaultReadListener(ExcelService<T> excelService){
        this.excelService = excelService;
    }

    /**
     * 每条数据解析的时候都会调用此方法
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(T data, AnalysisContext context) {
        log.info(data.toString());
        // 业务逻辑判断，调用ExcelService子类方法
        if (excelService.checkExcelData(data)){
            resultList.add(data);
        }else {
            failList.add(data);
        }
    }

    /**
     * 所有数据解析完成后执行
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("导入完成!");
    }

    /**
     * 获取Excel解析结果
     *
     * @return
     */
    @Override
    public Map<String, List<T>> getResultMap(){
        Map<String, List<T>> resultMap = new HashMap<>(2);
        resultMap.put("result", resultList);
        resultMap.put("fail", failList);
        return resultMap;
    }

    /**
     * 获取校验成功结果集
     *
     * @return
     */
    @Override
    public List<T> getSuccessResult() {
        return resultList;
    }

    /**
     * 获取校验失败结果集
     *
     * @return
     */
    @Override
    public List<T> getFailResult() {
        return failList;
    }
}
